<?php

/**
 * 文件操作类
 */
class File
{

    /**
     * 创建目录
     */
    public static function makeDir($strDir, $mod = 0777)
    {
        return is_dir($strDir) || (self::makeDir(dirname($strDir), $mod) && mkdir($strDir, $mod));
    }

    /**
     * 取目录中的文件(夹)
     */
    public static function getFilesInDir($strDir, $arrExt = array())
    {
        $arrRe = array();
        if (is_dir($strDir) && file_exists($strDir))
        {
            $hdl = opendir($strDir);
            is_array($arrExt) || $arrExt = array($arrExt);
            while (($file = readdir($hdl)) !== false)
            {
                if ($file != "." && $file != "..")
                {
                    $file = $strDir . DIRECTORY_SEPARATOR . $file;
                    if (is_dir($file))
                    {
                        $arrExt || array_push($arrRe, $file);
                        $arrRe = array_merge($arrRe, self::getFilesInDir($file, $arrExt));
                    }
                    else
                    {
                        if ($arrExt)
                        {
                            in_array(self::getFileExt($file), $arrExt) && array_push($arrRe, $file);
                        }
                        else
                        {
                            array_push($arrRe, $file);
                        }
                    }
                }
            }
            closedir($hdl);
        }
        return $arrRe;
    }

    /**
     * 删除目录
     */
    public static function delDir($strDir)
    {
        $arrFile = self::getFilesInDir($strDir);
        foreach ($arrFile as $file)
        {
            if (is_dir($file))
            {
                self::delDir($file);
            }
            else
            {
                self::del($file);
            }
        }
        return is_dir($strDir) && rmdir($strDir);
    }

    /**
     * 创建文件
     */
    public static function write($strFile, $strContent = '', $mod = 'w')
    {
        $re = false;
        self::makeDir(dirname($strFile));
        $hdl = fopen($strFile, $mod);
        if ($hdl)
        {
            flock($hdl, LOCK_EX);
            $re = is_writable($strFile) && fwrite($hdl, $strContent);
            flock($hdl, LOCK_UN);
            fclose($hdl);
        }
        return $re;
    }
    
    /**
     * 生成一个指定内容的PHP文件
     * @param string $strFile
     * @param string $data
     */
    public static function writePhpData($strFile, $data)
    {
        self::write($strFile, '<?php' . PHP_EOL . 'return ' . var_export($data, true) . ';');
    }

    /**
     * 读取文件内容
     */
    public static function read($strFile)
    {
        return (file_exists($strFile) && is_file($strFile)) ? file_get_contents($strFile) : false;
    }

    /**
     * 按行读取文件
     */
    public static function readLines($strFile)
    {
        return (file_exists($strFile) && is_file($strFile)) ? file($strFile) : false;
    }

    /**
     * 删除文件
     */
    public static function del($strFile)
    {
        return (file_exists($strFile) && is_file($strFile)) ? unlink($strFile) : false;
    }

    /**
     * 取文件扩展名
     */
    public static function getFileExt($strFile)
    {
        $strRe = false;
        $strFile = basename($strFile);
        if (($intTemp = strrpos($strFile, '.')) > 0)
        {
            $strRe = substr($strFile, $intTemp + 1);
            if (($intTemp = strpos($strRe, '?')) > 0)
            {
                $strRe = substr($strRe, 0, $intTemp);
            }
            $strRe = strtolower($strRe);
        }
        return $strRe;
    }
    
    /**
     * 取文件总行数
     * @param string $strFile
     * @return int intRe
     */
    public static function getLineCount($strFile)
    {
        $intRe = 0;
        $fp = fopen($strFile, 'r');
        if ($fp)
        {
            while (!feof($fp))
            {
                if (($strTemp = fread($fp, 2097152)) != false) // 1024 * 1024 * 2
                {
                    $intRe += substr_count($strTemp, PHP_EOL);
                }
            }
            fclose($fp);
        }
        return $intRe;
    }

}
